{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lattice models"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "In quantum physics (including condensed matter physics and high energy physics) we often study models on lattices. \n",
    "For example, when we think about behavior of electrons in a solid, we can study a model defined on a lattice by considering the positions of atoms as lattice points.\n",
    "This notebook demonstrates how we can utilize `Lattice` classes to generate various lattice systems such as `LineLattice`, `SquareLattice`, `HyperCubicLattice`, `TriangularLattice`, and a general lattice. \n",
    "It also includes an example of a lattice model, the Fermi-Hubbard model. \n",
    "We see how we can define the Hamiltonian of the Fermi-Hubbard model for a given lattice using `FermiHubbardModel` class. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import pi\n",
    "\n",
    "import numpy as np\n",
    "import retworkx as rx\n",
    "from qiskit_nature.problems.second_quantization.lattice import (\n",
    "    BoundaryCondition,\n",
    "    FermiHubbardModel,\n",
    "    HyperCubicLattice,\n",
    "    Lattice,\n",
    "    LatticeDrawStyle,\n",
    "    LineLattice,\n",
    "    SquareLattice,\n",
    "    TriangularLattice,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LineLattice\n",
    "`LineLattice` provides a one-dimensional lattice.\n",
    "We can construct a one-dimensional lattice as follows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_nodes = 11\n",
    "boundary_condition = BoundaryCondition.OPEN\n",
    "line_lattice = LineLattice(num_nodes=num_nodes, boundary_condition=boundary_condition)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, it is visualized."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAI30lEQVR4nO3dT2jfdx3H8fevSW1WurTgCiumOmr/ZJetbAgehLWiMDqGCBUvO3kYUg9677lnTxuoCApDHPbgqbfZDjwI2rWrQtNayliz2i3LGmtdU5v252FWUKR1/f5+6eeb1+NxTX4fXnx/gecvyTe/DIbD4bAAIMS6hz0AAFaT8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKJMPuwB/68Pr9+soyfna+7Ktbq2vFLTU5M1+/h0fevZmfrspg2xW+zpzxZ7+rWnpS32jNZgOBwOH/aIe3n70lK9cuJCvXl+oaqqbq7c+ffHpibX1bCq9u3ZWoee21lPb98Ss8We/myxp197Wtpiz3g0Hb7XfvdOHTk2V8srt+teKweDqqnJiTp8YLZe+vITa36LPf3ZYk+/9rS0xZ7xaTZ8n1zgs3Xj1p37f/K/PLJ+XR0+8OTIL3RLW+zpzxZ7+rWnpS32jFeTN7e8fWmpjhyb+1QXuKrqxq07deTYXJ2ZX1qTW+zpzxZ7+rWnpS32jF+T4XvlxIVaXrn9QI9dXrldr564sCa32NOfLfb0a09LW+wZv+bC9+H1m/Xm+YV7/vz4XobDquPnFmrx+s01tcWe/myxp197Wtpiz+poLnxHT853PmNQVUff6n5OS1uq7OnLlip77qelPS1tqbJnNTR3c8sPXj9Vvz59ufM5W66eq+3vHe90xvz2r9XVzTub2FJVtfTkN+rSxLZm9kx85Tt1eukzTey5NPPVWtqyewRbztf2937T+Zz3dzxfH2x8YgR7RvNcrXzppTp7Y1MzezY///367Xz37wBGsefy579ei9NfbGJLVdXfnzpYF+881syeqf3frd8vdD6mvrn3c/XDb+/tftAINPcH7NeWV0ZyzsyO3fXyC7s6nfHjuXV19aM2tlRV/eziVF268o9m9vxifrpq6XoTe350dlBLVztPqZkdu+rlF7q/2Pnpn9fXBwsP9juR/9wzmufqtXc3Vc1/3MyeX72/saq6h28Ue35ybqIWF7u//h/Vtfn5Oxvr4uXlZvb88vLmqoW/dj7n2vKtzmeMSnPhm54azaRdX5ipF1/c2+mMNz4+VX/8qPt3n6PYUlX1xuun6uSVtvbUu93DN6rn6k9X27o2pxfa2jOK8I10T3V/pTKqr50zi209V3+43Naequ7hm55a3/mMUWnud3yzj0/Xhslus6Ym19XstkfX1BZ7+rPFnn7taWmLPaujufAdfHam8xnDqjr4TPdzWtpSZU9ftlTZcz8t7WlpS5U9q6G58D22aUM9t3trDQYP9vjBoGr/nq0jeZPUlrbY058t9vRrT0tb7FkdzYWvqup7+3bW1OTEAz12anKiDu3rfnNCi1vs6c8We/q1p6Ut9oxfk+F7evuWOnxgth5Z/+nmffK+cLP11MyWNbnFnv5ssadfe1raYs/4NXdX511339S0hXcCb2mLPf3ZYk+/9rS0xZ7xau4P2P/bmfmlevXEhTp+bqEGVbX8P/730/49W+vQvp1jf1XR0hZ7+rPFnn7taWmLPePRfPjuWrx+s46+NV9zf/lbXVu+VdNT62t226N18JnV/2+/LW2xpz9b7OnXnpa22DNavQkfAIxCkze3AMC4CB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQJR/Agxnju4EdyQBAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "line_lattice.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also construct a one-dimensional lattice with the periodic boundary conditions by specifying `BoundaryCondition.PERIODIC` as the argument of `boundary_condition`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "num_nodes = 11\n",
    "boundary_condition = BoundaryCondition.PERIODIC\n",
    "line_lattice = LineLattice(num_nodes=num_nodes, boundary_condition=boundary_condition)\n",
    "\n",
    "line_lattice.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we want to draw the lattice ignoring the boundary conditions, we use the method `draw_without_boundary`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Wrx+s46+NV9zf/lbXVu+VdNT62t226N18JnV/2+/LW2xpz9b7OnXnpa22DNavQkfAIxCkze3AMC4CB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQJR/Agxnju4EdyQBAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "line_lattice.draw_without_boundary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define real or complex weights for the edges of the lattice.\n",
    "This is done by giving a value to the argument `edge_parameter`.\n",
    "We can also give a value for the self-loops of the lattice by passing the value for `onsite_parameter`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{(0, 0, 1.0),\n",
       " (0, 1, (1+1j)),\n",
       " (0, 10, (1-1j)),\n",
       " (1, 1, 1.0),\n",
       " (1, 2, (1+1j)),\n",
       " (2, 2, 1.0),\n",
       " (2, 3, (1+1j)),\n",
       " (3, 3, 1.0),\n",
       " (3, 4, (1+1j)),\n",
       " (4, 4, 1.0),\n",
       " (4, 5, (1+1j)),\n",
       " (5, 5, 1.0),\n",
       " (5, 6, (1+1j)),\n",
       " (6, 6, 1.0),\n",
       " (6, 7, (1+1j)),\n",
       " (7, 7, 1.0),\n",
       " (7, 8, (1+1j)),\n",
       " (8, 8, 1.0),\n",
       " (8, 9, (1+1j)),\n",
       " (9, 9, 1.0),\n",
       " (9, 10, (1+1j)),\n",
       " (10, 10, 1.0)}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_nodes = 11\n",
    "boundary_condition = BoundaryCondition.PERIODIC\n",
    "edge_parameter = 1.0 + 1.0j\n",
    "onsite_parameter = 1.0\n",
    "line_lattice = LineLattice(\n",
    "    num_nodes=num_nodes,\n",
    "    edge_parameter=edge_parameter,\n",
    "    onsite_parameter=onsite_parameter,\n",
    "    boundary_condition=boundary_condition,\n",
    ")\n",
    "set(line_lattice.graph.weighted_edge_list())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The connectivity of the lattice can be seen as the adjacency matrix, which is done by `to_adjacency_matrix`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 1., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_lattice.to_adjacency_matrix()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By setting `weighted=True`, we obtain a Hermitian matrix whose matrix elements are the weights."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.+0.j, 1.+1.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\n",
       "        0.+0.j, 0.+0.j, 1.-1.j],\n",
       "       [1.-1.j, 1.+0.j, 1.+1.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\n",
       "        0.+0.j, 0.+0.j, 0.+0.j],\n",
       "       [0.+0.j, 1.-1.j, 1.+0.j, 1.+1.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\n",
       "        0.+0.j, 0.+0.j, 0.+0.j],\n",
       "       [0.+0.j, 0.+0.j, 1.-1.j, 1.+0.j, 1.+1.j, 0.+0.j, 0.+0.j, 0.+0.j,\n",
       "        0.+0.j, 0.+0.j, 0.+0.j],\n",
       "       [0.+0.j, 0.+0.j, 0.+0.j, 1.-1.j, 1.+0.j, 1.+1.j, 0.+0.j, 0.+0.j,\n",
       "        0.+0.j, 0.+0.j, 0.+0.j],\n",
       "       [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.-1.j, 1.+0.j, 1.+1.j, 0.+0.j,\n",
       "        0.+0.j, 0.+0.j, 0.+0.j],\n",
       "       [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.-1.j, 1.+0.j, 1.+1.j,\n",
       "        0.+0.j, 0.+0.j, 0.+0.j],\n",
       "       [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.-1.j, 1.+0.j,\n",
       "        1.+1.j, 0.+0.j, 0.+0.j],\n",
       "       [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.-1.j,\n",
       "        1.+0.j, 1.+1.j, 0.+0.j],\n",
       "       [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\n",
       "        1.-1.j, 1.+0.j, 1.+1.j],\n",
       "       [1.+1.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\n",
       "        0.+0.j, 1.-1.j, 1.+0.j]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_lattice.to_adjacency_matrix(weighted=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SquareLattice\n",
    "`SquareLattice` provides a two-dimensional lattice.\n",
    "Here, we make a two-dimensional lattice with the open boundary conditions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rows = 5\n",
    "cols = 4\n",
    "boundary_condition = BoundaryCondition.OPEN\n",
    "square_lattice = SquareLattice(rows=rows, cols=cols, boundary_condition=boundary_condition)\n",
    "\n",
    "square_lattice.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can specify the boundary conditions for each direction by setting `boundary_condition` as a tuple."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rows = 5\n",
    "cols = 4\n",
    "boundary_condition = (\n",
    "    BoundaryCondition.OPEN,\n",
    "    BoundaryCondition.PERIODIC,\n",
    ")  # open in the x-direction, periodic in the y-direction\n",
    "square_lattice = SquareLattice(rows=rows, cols=cols, boundary_condition=boundary_condition)\n",
    "\n",
    "square_lattice.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Again, we can give weights on the edges and the self-loops of the lattice.\n",
    "Here, it is possible to give weights for each direction as a tuple."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{(0, 0, 1.0),\n",
       " (0, 1, 1.0),\n",
       " (0, 5, (1+1j)),\n",
       " (0, 15, (1-1j)),\n",
       " (1, 1, 1.0),\n",
       " (1, 2, 1.0),\n",
       " (1, 6, (1+1j)),\n",
       " (1, 16, (1-1j)),\n",
       " (2, 2, 1.0),\n",
       " (2, 3, 1.0),\n",
       " (2, 7, (1+1j)),\n",
       " (2, 17, (1-1j)),\n",
       " (3, 3, 1.0),\n",
       " (3, 4, 1.0),\n",
       " (3, 8, (1+1j)),\n",
       " (3, 18, (1-1j)),\n",
       " (4, 4, 1.0),\n",
       " (4, 9, (1+1j)),\n",
       " (4, 19, (1-1j)),\n",
       " (5, 5, 1.0),\n",
       " (5, 6, 1.0),\n",
       " (5, 10, (1+1j)),\n",
       " (6, 6, 1.0),\n",
       " (6, 7, 1.0),\n",
       " (6, 11, (1+1j)),\n",
       " (7, 7, 1.0),\n",
       " (7, 8, 1.0),\n",
       " (7, 12, (1+1j)),\n",
       " (8, 8, 1.0),\n",
       " (8, 9, 1.0),\n",
       " (8, 13, (1+1j)),\n",
       " (9, 9, 1.0),\n",
       " (9, 14, (1+1j)),\n",
       " (10, 10, 1.0),\n",
       " (10, 11, 1.0),\n",
       " (10, 15, (1+1j)),\n",
       " (11, 11, 1.0),\n",
       " (11, 12, 1.0),\n",
       " (11, 16, (1+1j)),\n",
       " (12, 12, 1.0),\n",
       " (12, 13, 1.0),\n",
       " (12, 17, (1+1j)),\n",
       " (13, 13, 1.0),\n",
       " (13, 14, 1.0),\n",
       " (13, 18, (1+1j)),\n",
       " (14, 14, 1.0),\n",
       " (14, 19, (1+1j)),\n",
       " (15, 15, 1.0),\n",
       " (15, 16, 1.0),\n",
       " (16, 16, 1.0),\n",
       " (16, 17, 1.0),\n",
       " (17, 17, 1.0),\n",
       " (17, 18, 1.0),\n",
       " (18, 18, 1.0),\n",
       " (18, 19, 1.0),\n",
       " (19, 19, 1.0)}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rows = 5\n",
    "cols = 4\n",
    "edge_parameter = (1.0, 1.0 + 1.0j)\n",
    "boundary_condition = (\n",
    "    BoundaryCondition.OPEN,\n",
    "    BoundaryCondition.PERIODIC,\n",
    ")  # open in the x-direction, periodic in the y-direction\n",
    "onsite_parameter = 1.0\n",
    "square_lattice = SquareLattice(\n",
    "    rows=rows,\n",
    "    cols=cols,\n",
    "    edge_parameter=edge_parameter,\n",
    "    onsite_parameter=onsite_parameter,\n",
    "    boundary_condition=boundary_condition,\n",
    ")\n",
    "\n",
    "set(square_lattice.graph.weighted_edge_list())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## HyperCubicLattice\n",
    "`HyperCubicLattice` is a generalization of `LineLattice` and `SquareLattice`. \n",
    "It provides an arbitrary d-dimensional lattice.\n",
    "Here, we make a three-dimensional lattice of size 3 by 4 by 5 as an example.\n",
    "The size is given as a tuple, and the boundary conditions can be specified for each direction too.\n",
    "In the example, the boundary conditions are open."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "size = (3, 4, 5)\n",
    "boundary_condition = (\n",
    "    BoundaryCondition.OPEN,\n",
    "    BoundaryCondition.OPEN,\n",
    "    BoundaryCondition.OPEN,\n",
    ")\n",
    "cubic_lattice = HyperCubicLattice(size=size, boundary_condition=boundary_condition)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We draw the cubic lattice specifying the positions of the lattice points."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# function for setting the positions\n",
    "def indextocoord_3d(index: int, size: tuple, angle) -> list:\n",
    "    z = index // (size[0] * size[1])\n",
    "    a = index % (size[0] * size[1])\n",
    "    y = a // size[0]\n",
    "    x = a % size[0]\n",
    "    vec_x = np.array([1, 0])\n",
    "    vec_y = np.array([np.cos(angle), np.sin(angle)])\n",
    "    vec_z = np.array([0, 1])\n",
    "    return_coord = x * vec_x + y * vec_y + z * vec_z\n",
    "    return return_coord.tolist()\n",
    "\n",
    "\n",
    "pos = dict([(index, indextocoord_3d(index, size, angle=pi / 4)) for index in range(np.prod(size))])\n",
    "\n",
    "cubic_lattice.draw(style=LatticeDrawStyle(pos=pos))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TriangularLattice\n",
    "`TriangularLattice` provides a triangular lattice, which can be seen as a two-dimensional lattice with diagonal edges.\n",
    "The argument `boundary_condition` can take either \"open\" or \"periodic\"."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rows = 4\n",
    "cols = 3\n",
    "boundary_condition = BoundaryCondition.OPEN\n",
    "\n",
    "triangular_lattice = TriangularLattice(rows=rows, cols=cols, boundary_condition=boundary_condition)\n",
    "\n",
    "triangular_lattice.draw()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rows = 4\n",
    "cols = 3\n",
    "boundary_condition = BoundaryCondition.PERIODIC\n",
    "\n",
    "triangular_lattice = TriangularLattice(rows=rows, cols=cols, boundary_condition=boundary_condition)\n",
    "\n",
    "triangular_lattice.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## General Lattice\n",
    "Above, we have seen translational invariant lattices.\n",
    "Here, we consider a general lattice.\n",
    "We can construct a general lattice consisting of nodes and edges using an instance of PyGraph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{(0, 1, (1+1j)),\n",
       " (0, 2, -1.0),\n",
       " (2, 3, 2.0),\n",
       " (2, 5, -1.0),\n",
       " (4, 2, (-1+2j)),\n",
       " (4, 4, 3.0)}"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "graph = rx.PyGraph(multigraph=False)  # multiigraph shoud be False\n",
    "graph.add_nodes_from(range(6))\n",
    "weighted_edge_list = [\n",
    "    (0, 1, 1.0 + 1.0j),\n",
    "    (0, 2, -1.0),\n",
    "    (2, 3, 2.0),\n",
    "    (4, 2, -1.0 + 2.0j),\n",
    "    (4, 4, 3.0),\n",
    "    (2, 5, -1.0),\n",
    "]\n",
    "graph.add_edges_from(weighted_edge_list)\n",
    "\n",
    "# make a lattice\n",
    "general_lattice = Lattice(graph)\n",
    "set(general_lattice.graph.weighted_edge_list())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here is its visualization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "general_lattice.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we want to visualize the self-loops in the lattice, we set `self_loop` to True."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAhDUlEQVR4nO3de3SU9b3v8c8kEzMgxLQQJBG5hIQMYAhBVBA9CSKgQbFaqOim3eWsUxCssEFbyqV2KYSLVYMK1FoLHkq1CFg5Bapu5aYIVSHhIgkhhEiCIOESQiCTZCbP+YPKNoZLkpnJ88zM+7UWa7FI5jefsJJ8nu9ztRmGYQgAgBARZnYAAACaE8UHAAgpFB8AIKRQfACAkELxAQBCCsUHAAgpFB8AIKRQfACAkELxAQBCCsUHAAgpFB8AIKRQfACAkELxAQBCCsUHAAgpFB8AIKRQfACAkELxAQBCCsUHAAgpFB8AIKRQfACAkELxAQBCCsUHAAgpdrMDAEBjnaio0qodJco7Vq5yl1tRDruc7aM08uYOatMq0ux4sDibYRiG2SEAoCF2FZdp0aYCbc4vlSRVuWsvfsxhD5MhKT0pRhPSEpRyY7Q5IWF5FB+AgLB8e5Ey1+fJ5fboSr+1bDbJYQ/XjAynRvfr3Gz5EDjY1QnA8i6UXq4qa2qv+rmGIVXWeJS5PleSKD/Uw8ktACxtV3GZMtfnNaj0vquyplaZ6/O0u6TMP8EQsCg+AJa2aFOBXG5Pk17rcnu0eFOBjxMh0FF8ACzrREWVNueXXvGY3pUYhrRxf6lOVlT5NhgCGsUHwLJW7Sjxeg2bpFU7vV8HwYPiA2BZecfK61yy0BQud63yjp71USIEA4oPgGWVu9w+WqfGJ+sgOFB8ACwryuGbK66iHBE+WQfBgeIDYFnO9lGKtHv3a8phD5MztrWPEiEYUHwALGvEzR28XsOQNKKP9+sgeFB8ACyrbatIpXWLkc3WtNfbbNLApBhuXI06KD4AlvZ4eoIc9vAmvdZhD9eE9AQfJ0Kgo/gAWFrKjdGakeFUi4jG/bpqERGmGRlO9eoQ7Z9gCFgUHwDLG92vs2ZkdFe44dHV9nrabFKLiHDNyOjODapxSRQfgIDQP8ajijWzdFe3Noq0h8nxvbM9HfYwRdrDNLTH9Voxth+lh8vieXwAAsLYsWPVvn17PfvsszpZUaVVO0uUd/Ssyl01inJEyBnbWiP68AR2XB3FB8DySkpKlJKSovz8fLVp08bsOAhw7OoEYHm///3vNWbMGEoPPsHEB8DSjh8/LqfTqS+//FKxsbFmx0EQYOIDYGlZWVl65JFHKD34DBMfAMs6ffq0EhIStHPnTnXq1MnsOAgSTHwALGvhwoUaPnw4pQefYuIDYEkVFRWKj4/Xxx9/rKSkJLPjIIgw8QGwpFdffVUDBw6k9OBzTHwALMflcik+Pl7//Oc/lZKSYnYcBBkmPgCWs2TJEvXt25fSg18w8QGwlJqaGiUmJmrFihW67bbbzI6DIMTEB8BSli9froSEBEoPfsPEB8AyPB6Punfvrj/+8Y8aOHCg2XEQpJj4AFjGqlWr1LZtW6Wnp5sdBUHMbnYAAJAkwzA0Z84czZkzRzbb1R43CzQdEx8AS1i7dq3CwsKUkZFhdhQEOYoPgOkMw9Ds2bM1Y8YMpj34HcUHwHQfffSRysvL9dBDD5kdBSGA4gNguszMTE2bNk1hYfxKgv/xXQbAVJ9++qmKior0yCOPmB0FIYLiA2CqzMxMTZ06VREREWZHQYjgAnYAptm5c6fuv/9+HTx4UA6Hw+w4CBFMfABMM2fOHD311FOUHpoVEx8AU+Tm5io9PV2FhYW69tprzY6DEMLEB8AUc+fO1cSJEyk9NDsmPgDNrrCwULfeeqsKCgoUHR1tdhyEGCY+AM1u/vz5euyxxyg9mIKJD0CzOnLkiJKTk5Wfn6+2bduaHQchiOID0KwmT54sm82mF1980ewoCFEUH4BmU1paqqSkJO3du1dxcXFmx0GI4hgfgGaTlZWln/zkJ5QeTMXEB6BZlJWVqWvXrvriiy/UpUsXs+MghDHxAWgWCxcu1H333UfpwXRMfAD8rqKiQvHx8dqyZYucTqfZcRDimPgA+N1rr72mtLQ0Sg+WwMQHwK9cLpfi4+O1bt06paammh0HYOID4F9Lly5Vnz59KD1YBhMfAL+pqalRYmKi3nrrLfXv39/sOIAkJj4AfvTmm28qPj6e0oOlMPEB8AuPx6OePXtq0aJFGjRokNlxgIuY+AD4xerVqxUdHa277rrL7ChAHRQfAJ8zDENz5szRzJkzZbPZzI4D1EHxAfC5devWSZKGDRtmchKgPooPgE8ZhqHZs2dr+vTpTHuwJIoPgE9t2LBBZWVl+vGPf2x2FOCSKD4APpWZmalp06YpPDzc7CjAJVF8AHxm27ZtOnTokB599FGzowCXRfEB8JnMzEz9+te/VkREhNlRgMviAnYAPpGdna1hw4apsLBQDofD7DjAZTHxAfCJOXPm6Mknn6T0YHlMfAC8lpubq7S0NBUWFqpVq1ZmxwGuiIkPgNfmzZuniRMnUnoICEx8ALxy6NAh9e3bVwcPHlR0dLTZcYCrYuID4JX58+dr3LhxlB4CBhMfgCY7cuSIkpOTtX//fsXExJgdB2gQig9Ak02ZMkWGYSgrK8vsKECDUXwAmuTEiRPq1q2b9uzZoxtuuMHsOECDcYwPQJMsWLBAI0eOpPQQcJj4ADRaWVmZunbtqs8//1zx8fFmxwEaxW52AADWdaKiSqt2lCjvWLnKXW5FOexyto9S5ZcbNGzYMEoPAYmJD0A9u4rLtGhTgTbnl0qSqty1Fz/msIep1pD+V+IP9cRdSUq5MdqklEDTUHwA6li+vUiZ6/Pkcnt0pd8ONpvksIdrRoZTo/t1brZ8gLfY1Qngogull6vKmtqrfq5hSJU1HmWuz5Ukyg8Bg7M6AUi6sHszc31eg0rvuyprapW5Pk+7S8r8EwzwMYoPgCRp0aYCudyeJr3W5fZo8aYCHycC/IPiA6ATFVXanF96xWN6V2IY0sb9pTpZUeXbYIAfUHwAtGpHiddr2CSt2un9OoC/UXwAlHesvM4lC03hctcq7+hZHyUC/IfiA6Byl9tH69T4ZB3Anyg+AIpy+ObKpihHhE/WAfyJ4gMgZ/soRdq9+3XgsIfJGdvaR4kA/6H4AGjEzR28XsOQNKKP9+sA/kbxAVDbVpFK6xYjm61pr7fZpIFJMWrTKtK3wQA/oPgASJIeT0+Qwx7epNc67OGakJ7g40SAf1B8ACRJKTdGa0aGUy0iGvdroUVEmGZkONWrQ7R/ggE+RvEBuGh0v86akdFd14RJMq58XZ/NJrWICNeMjO7coBoBhccSAajDMAzddu9IxaT9hwrOO2TThYvTv+Wwh8nQhWN6E9ITmPQQcHgsEYA6Nm3apDOH9mjbuuEqq3Rr1c4S5R09q3JXjaIcEXLGttaIPh04kQUBi4kPQB0DBw7UmDFj9LOf/czsKIBfcIwPwEVbtmxRcXGxHn30UbOjAH5D8QG46Nlnn9X06dNlt3MUBMGL4gMgSdq6dasKCgr005/+1OwogF9RfAAkSbNmzdL06dMVEcGNphHc2J8BQP/617+0b98+rVmzxuwogN8x8QHQrFmz9Jvf/EaRkVyigODH5QxAiNuxY4ceeOABFRQUyOFwmB0H8DsmPiDEzZo1S1OnTqX0EDKY+IAQlpOTo4yMDB08eFAtWrQwOw7QLJj4gBA2e/Zs/epXv6L0EFKY+IAQtWfPHg0ePFiFhYVq2bKl2XGAZsPEB4So2bNn68knn6T0EHKY+IAQtG/fPqWnp6uwsFCtWrUyOw7QrJj4gBCUmZmpyZMnU3oISUx8QIjZv3+/7rjjDh08eFBRUVFmxwGaHRMfEGLmzJmjiRMnUnoIWUx8QAgpKChQv379VFBQoOjoaLPjAKZg4gNCyNy5c/X4449TeghpTHxAiDh06JD69u2rgoIC/eAHPzA7DmAaJj4gRMybN0/jx4+n9BDymPiAEHD48GGlpqYqPz9fbdq0MTsOYComPiAEzJs3T7/4xS8oPUBMfEDQKykpUa9evZSXl6d27dqZHQcwHcUHBLmJEyfqmmuu0fPPP292FMASKD4giB09elQ9e/bUvn371L59e7PjAJZA8QFBbMqUKaqtrdWCBQvMjgJYBsUHBKlvvvlG3bt31969exUXF2d2HMAyOKsTCFIvvPCCHn30UUoP+B4mPiAIlZaWKikpSbt371aHDh3MjgNYChMfEISysrL08MMPU3rAJTDxAUHm1KlTSkxM1M6dO9WpUyez4wCWw8QHBJmsrCw99NBDlB5wGUx8QBA5ffq0EhIS9Pnnnys+Pt7sOIAlMfEBQeTll1/W8OHDKT3gCpj4gCBx5swZde3aVdu2bVNiYqLZcQDLYuIDgsTChQt17733UnrAVTDxAUHg7Nmz6tq1q7Zs2SKn02l2HMDSmPiAILB48WINGjSI0gMagIkPCHDnzp1TfHy8NmzYoJ49e5odB7A8Jj4gwL366qtKS0uj9IAGYuIDAtj58+fVtWtXvf/+++rVq5fZcYCAwMQHBLDXXntN/fv3p/SARmDiAwJUZWWlunbtqnXr1ik1NdXsOEDAYOIDAtSf//xn9e3bl9IDGomJDwhAVVVVSkhI0DvvvKNbbrnF7DhAQGHiAwLQ0qVLlZycTOkBTcDEBwSY6upqJSYm6m9/+5v69+9vdhwg4DDxAQFm2bJlSkpKovSAJmLiAwJITU2NkpKStGzZMt1xxx1mxwECEhMfEED++te/qkuXLpQe4AUmPiBAuN1ude/eXa+//rrS0tLMjgMELCY+IEC89dZbiouLo/QALzHxAQHA4/GoR48eFx8/BKDpmPiAAPD222+rbdu2uuuuu8yOAgQ8Jj7A4mpra3XTTTcpKytLQ4cONTsOEPCY+ACLW716tVq3bq0hQ4aYHQUICkx8gIXV1taqd+/emjt3roYNG2Z2HCAoMPEBFrZmzRpFREQoIyPD7ChA0KD4AIsyDEPPPvusnn76adlsNrPjAEGD4gMsau3atTIMQ8OHDzc7ChBUKD7Agpj2AP+h+AALeu+99+RyufSjH/3I7ChA0LGbHaAhTlRUadWOEuUdK1e5y60oh13O9lEaeXMHtWkVaXY8wKcMw9Azzzyj3/72twoLY9sU8DVLX86wq7hMizYVaHN+qSSpyl178WMOe5gMSelJMZqQlqCUG6PNCQk00eU26GLOFui3v56sPXv2KDw83OyYQNCxbPEt316kzPV5crk9ulJCm01y2MM1I8Op0f06N1s+oKmutkFXXVOj7tGG5vxHGht0gB9YsvgulF6uKmtqr/7J/9YiIkwzMrpTfrA0NugA81nuAMKu4jJlrs9rVOlJUmVNrTLX52l3SZl/ggFe+p8NuiuXniQZhlRZ41Hm+lwt317ULPmAUGG54lu0qUAut6dJr3W5PVq8qcDHiQDvsUEHWIeliu9ERZU255dedWv4cgxD2ri/VCcrqnwbDPASG3SAdViq+FbtKPF6DZukVTu9XwfwFTboAGuxVPHlHSuvc4ZbU7jctdpbfFrnz5+Xy+VSVVWVqqurVVNTI4/Ho9raWlnwfB4EMTboAGux1AXs5S63T9ZZ9f/W6fX/c6cMw7hYdN/9+7dsNptsNpvCwsIa9femvMaXrydLYGXJKXL7ZIMu7+hZb380AMhixRfl8E2cUQ89oKwVv7vi51yuFBv6d7Nf3xxZmvIejX1/t9sdcP8vjf175JD/kvQDr7+vy101Xq8BwGLF52wfpUj7Ma+2jh32MDljW1/182w2G3fFQLP4rxXZOpLztdfrnPrmiPLzr1NCQgK3MgO8YKmfnhE3d/B6DUPSiD7erwP4yoUNOu9+1MJVq2/2Z2vo0KGKjo7WHXfcoSeeeEJLlixRdna2qqo48QVoKMvduWXsX77Qf+d+06Qz4Gw2aWiP6/Xq6L6+DwY00YmKKg2Yv8GrPRmR9jB9OvUutWkVqdOnTysnJ0fZ2dkX/xQWFqpbt25KTU29+CclJUVRUVE+/EqA4GC54ttVXKZRf9quyprGX/PUIiJcK8b2U68O0b4PBnjB3xt0lZWV2rt3b50y3LNnj2JjY+uUYWpqqtq3b+/FVwIEPssVn8S9OhF8zNigc7vdys/PV3Z2dp0J8ZprrrlYgr1791Zqaqri4+M5boiQYcnik7iZL4KPFTboDMNQcXFxnckwOztbZ86cUUpKSp3JsEePHoqIiPDJ+wJWYtnik6TdJWVavKlAG/eXyqYL1zJ969vn8Q1MitGE9AR2byIgLN9epNnrclXlrtWVfvCae4Pu5MmT9Y4bFhUVyel01jtu2KpVK7/ngXmqq6t16tQpVVdX69y5c2rZsqUiIiJ03XXX6dprrzU7nk9Yuvi+dbKiSqt2lijv6FmVu2oU5YiQM7a1RvThCewIPP85+WkVOhJ03B5j6Q268+fPa/fu3ReLMCcnR19++aU6dOhQZzdpamqq2rVrZ1pONE1lZaU+/fRTbdq0Sfn5+Tp8+LAOHz6sEydOKDo6WhERETpy5IhiYmIUHh6usrIytWzZUh07dlSnTp3UpUsXDRgwQOnp6Wrbtq3ZX06jBETxAcHi+PHjcjqd2rt3ryKj2gTcBp3b7VZeXl6dyTAnJ0ctW7asMxn27t1bXbp0kc1mMzsyvqOsrExvvPGG1qxZo88//1wpKSkaOHCgevbsqY4dO6pjx46Ki4u75DXOhmHoxIkTOnz4sL766isVFBRoy5Yt+vjjj9WlSxfdc889Gjt2rOLj4034yhqH4gOa0bRp03TmzBktXrzY7Cg+YxiGioqK6u0qraioqDMVpqamyul0ctzQBAcOHNCCBQv05ptv6t5779Xo0aN15513qnXrq9/s42pqamq0Y8cOrV69WkuXLtWAAQM0efJkpaenex/cTyg+oJmcOnVKiYmJ2rFjhzp37mx2HL8rLS2tNxkWFxerR48edQqxV69eQXPsyGrcbreee+45ZWVl6bHHHtP48eMVFxfnt/c7d+6cli9frvnz5+v222/XSy+9pDZt2vjt/ZqK4gOayTPPPKOvvvpKS5YsMTuKaSoqKuocN8zOzlZubq46depU7xKLQDtuZDVFRUUaMWKE2rRpoz/96U/q2LFjs733uXPnNGPGDL399ttatmyZ7r777mZ774ag+IBmcPbsWcXHx2vr1q3q1q2b2XEspbq6Wrm5uXWuN8zJyVFUVFS9i+87duzIccMG+Oqrr5Senq5f/vKXmjJlimn/Zxs3btTDDz+s5cuXa8iQIaZkuBSKD2gGzz33nLKzs/XWW2+ZHSUg1NbW6tChQ/WuN6yqqqp33DApKUl2u6Xut2+qkydP6tZbb9WkSZM0ceJEs+Pok08+0YMPPqg1a9bo9ttvNzuOJIoP8LvKykrFx8frgw8+UHJystlxAtqxY8fqnUTz9ddf66abbqpTiMnJyWrZsqXZcU0xduxYRUZG6pVXXjE7ykWrV6/W008/rZycHEuc3ETxAX72yiuv6KOPPtK7775rdpSgVF5erl27dtUpxLy8PMXHx9e7xOKHP/yh2XH96osvvtDw4cO1b98+RUdHmx3nIsMwlJGRocGDB2vKlClmx6H4AH+qrq5W165d9c477+iWW24xO07IqKqq0r59++pMhrt27VKbNm3q7Srt0KFD0Bw3fOKJJxQbG6vp06ebHaWebdu2ady4cdq9e7fZUSg+wJ9ef/11rVy5Uu+//77ZUUJebW2tDh48WO+4ocfjqXdGabdu3QLyQdUJCQlavXq1UlJSzI5Sj8fj0fXXX6/s7GzdeOONpmah+AA/cbvdSkpK0htvvKE777zT7Di4BMMwdPTo0XpPsPjmm2+UnJxcZzK86aab5HA4zI58WdXV1WrZsqVqamosO8EOHjxYTz31lIYOHWpqDk6FAvxkxYoVuuGGGyg9C7PZbIqLi1NcXJyGDRt28d/PnDlzsQg/+eQTvfLKKzpw4IASEhLqHTe00rG0sLAwy5aeJMs8+oriA/ygtrZWmZmZWrBggdlR0ATXXXed0tLSlJaWdvHfXC6Xvvzyy4tT4cqVK7V79261a9euXhnGxcU1ewGFh4crPDxc5eXlioqKatb3bqhTp05Z4i497OoE/GD16tWaN2+ePvvsM0tvgcM7Ho9HBw4cqLer1Gaz1bv4PiEhwe8Tz5AhQzR+/Hg9+OCDfn2fpjhx4oS6du2q48ePKzLS3JuwU3yAjxmGoZtvvlm/+93v9MADD5gdB83MMAwdOXKkzj1Ks7OzdfLkSfXq1avOWaU9e/b0aQm89NJL+uSTT7Ry5Uqv1jlRUaVVO0qUd6xc5S63ohx2OdtHaeTNTX9yyKJFi/Thhx/q73//u1fZfIHiA3xs/fr1mjp1qnbt2mWZYxow3+nTp+tdfF9YWKhu3brVe9hvU3dVnjt3Tj169NCyZcvq7KZtqF3FZVq0qUCb80slSVWXeFZkelKMJqQlKOXG6Aave/LkSfXo0UPvv/++evfu3ehcvkbxAT5kGIYGDBigiRMnatSoUWbHgcVVVlZq7969dcpwz549io2NrbertH379g1a85133tG0adO0devWRt3oe/n2ImWuz5PL7dGVWsFmkxz2cM3IcGp0v85XXdfj8WjUqFGKjY3Vyy+/3OA8/kTxAT60ceNGjRs3Trm5uQF5HRjM53a7lZ+fX++44TXXXFPvesP4+Ph6exUMw9DMmTO1du1abdiwoUGPBbpQermqrKm96ud+q0VEmGZkdL9i+Xk8Ho0ZM0Zff/21/vGPf6hFixYNXt+fKD7AhwYNGqTRo0drzJgxZkdBEDEMQ8XFxfUuvj9z5oxSUlLqTIY9evSQ3W7XtGnTtGbNGi1btuyKdw3aVVymUX/arsoaT6NztYgI14qx/dSrQ3S9jx09elRjx47VuXPntHbtWkvdO5XiA3xk27ZteuSRR3TgwAFL3IgXwe/kyZP1jhsWFRXJ6XSqd+/eMgxDa9as0c9//nPNmjXrkpcSjP3LF/rv3G+uuHvzcmw2aWiP6/Xq6L4X/83j8Wj58uX61a9+pXHjxmnmzJmmn8X5fRQf4CP33XefMjIyNGHCBLOjIISdP3/+4sN+c3Jy9Nlnn2nPnj0yDEOJiYl64IEHNGjQIPXu3VthLa/TgPkb6pzE0liR9jB9OvUu2T0uLVmyRAsXLlRMTIwWL16sPn36+PAr8x2KD/CB7OxsDRs2TIWFhZa+rRVCk9vt1ocffqiXX35ZGzduVGRkpKqqqpQ+frYKr+3hVfHZVauYbz5X3t9f0T333KNJkybptttus/T1qxQf4AMjR45U//79LfHIFeBKzp8/r48//lgfffSR1hyPVlWs9ze0To2u0R/H3K527dr5IKH/UXyAl3Jzc5WWlqZDhw5Z4nZMQEP97//7uTbkHfd6nUHOdvrzfwbOY7e4uhbw0ty5czVp0iRKDwEnyuGb2zVHOQLrZC6KD/BCYWGh1q1bp8cff9zsKECjOdtHKdLuXQ047GFyxrb2UaLmQfEBXpg/f77Gjx9vqUfTAA014uYOXq9hSBrRx/t1mhOPJQKaqKSkRCtXrlR+fr7ZUYAmadsqUmndYry6jm9gUkyTb1xtFiY+oImef/55jRkzplH3QwSs5vH0BDnsTbu9nsMergnpCT5O5H+c1Qk0wfHjx+V0OrV3717FxcWZHQfwir/u1WlV7OoEmuDFF1/UqFGjKD0EhW/Lyx9PZ7AiJj6gkU6dOqXExETt2LFDnTt3NjsO4DO7S8q0eFOBNu4vlU2S6xLP4xuYFKMJ6QmXvDF1oKD4gEZ65plnVFRUpKVLl5odBfCLkxVVWrWzRHlHz6rcVaMoR4Scsa01ok/Tn8BuJRQf0Ahnz55VfHy8tm7dqm7dupkdB0ATcFYn0Ah/+MMfdPfdd1N6QABj4gMaqLKyUvHx8frggw+UnJxsdhwATcTEBzTQ66+/rttuu43SAwIcEx/QANXV1UpISNDq1at1yy2Bcxd6APUx8QENsGzZMnXv3p3SA4IAEx9wFW63W0lJSXrjjTd05513mh0HgJeY+ICrWLFihW644QZKDwgSTHzAFdTW1io5OVlZWVkaMmSI2XEA+AATH3AF7777rlq2bKnBgwebHQWAj1B8wGUYhqHZs2dr5syZstlsZscB4CMUH3AZ7733ntxut+6//36zowDwIYoPuIRvp73p06crLIwfEyCY8BMNXMLmzZtVWlqqkSNHmh0FgI9RfMAlzJ49W9OmTVN4eLjZUQD4GMUHfM/27dtVUFCg0aNHmx0FgB9QfMD3ZGZmaurUqYqIiDA7CgA/4AJ24DtycnI0bNgwHTx4UA6Hw+w4APyAiQ/4jjlz5ujJJ5+k9IAgxsQH/Ftubq7S0tJ06NAhXXvttWbHAeAnTHzAv82bN0+TJk2i9IAgx8QHSCosLNStt96qgwcP6rrrrjM7DgA/YuIDJD333HN67LHHKD0gBDDxIeQdOXJEycnJys/PV9u2bc2OA8DPKD6EvMmTJyssLEwvvPCC2VEANAOKDyHt+PHjcjqd2rt3r+Li4syOA6AZ2M0OADSHExVVWrWjRHnHylXucivKYZezfZQKPviLRo0aRekBIYTiQ1DbVVymRZsKtDm/VJJU5a69+DGH/Zg8ukUD+kRrV3GZUm6MNiklgObErk4EreXbi5S5Pk8ut0dX+i632SSHPVwzMpwa3a9zs+UDYA4mPgSlC6WXq8qa2qt+rmFIlTUeZa7PlSTKDwhyXMeHoLOruEyZ6/MaVHrfVVlTq8z1edpdUuafYAAsgeJD0Fm0qUAut6dJr3W5PVq8qcDHiQBYCcWHoHKiokqb80uveEzvSgxD2ri/VCcrqnwbDIBlUHwIKqt2lHi9hk3Sqp3erwPAmig+BJW8Y+V1LlloCpe7VnlHz/ooEQCrofgQVMpdbh+tU+OTdQBYD8WHoBLl8M0VOlGOCJ+sA8B6KD4EFWf7KEXavfu2dtjD5Ixt7aNEAKyG4kNQGXFzB6/XMCSN6OP9OgCsieJDUGnbKlJp3WJkszXt9TabNDApRm1aRfo2GADLoPgQdB5PT5DDHt6k1zrs4ZqQnuDjRACshOJD0Em5MVozMpxqEdG4b+8WEWGakeFUrw7R/gkGwBK4STWC0rc3mubpDAC+j8cSIajtLinT4k0F2ri/VDZduDj9Ww57mAxdOKY3IT2BSQ8IERQfQsLJiiqt2lmivKNnVe6qUZQjQs7Y1hrRpwMnsgAhhuIDAIQUTm4BAIQUig8AEFIoPgBASKH4AAAhheIDAIQUig8AEFIoPgBASKH4AAAhheIDAIQUig8AEFIoPgBASKH4AAAhheIDAIQUig8AEFIoPgBASKH4AAAhheIDAIQUig8AEFIoPgBASKH4AAAhheIDAISU/w/WRE4+4H/fxQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "general_lattice.draw(self_loop=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The labels of the lattice sites are drawn when `with_labels` is True."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "general_lattice.draw(self_loop=True, style=LatticeDrawStyle(with_labels=True))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Fermi-Hubbard model\n",
    "The Fermi-Hubbard model is the simplest model describing electrons moving on a lattice and interaction with each other at the same site.\n",
    "The Hamiltonian is given as follows:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "H = \\sum_{i, j}\\sum_{\\sigma = \\uparrow, \\downarrow} t_{i, j} c_{i, \\sigma}^\\dagger c_{j, \\sigma} + U \\sum_{i} n_{i, \\uparrow} n_{i, \\downarrow},\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "where $c_{i, \\sigma}^\\dagger$ and $c_{i, \\sigma}$ are creation and annihilation operators of fermion at the site $i$ with spin $\\sigma$.\n",
    "The operator $n_{i, \\sigma}$ is the number operator, which is defined by $n_{i, \\sigma} = c_{i, \\sigma}^\\dagger c_{i, \\sigma}$. \n",
    "The matrix $t_{i, j}$ is a Hermitian matrix called interaction matrix.\n",
    "The parameter $U$ represents the strength of the interaction."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can generate the corresponding Hamiltonian of a given lattice using `FermiHubbardModel` class.\n",
    "Here, we construct the Hamiltonian with uniform interaction and interaction parameters on a two-dimensional lattice."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "square_lattice = SquareLattice(rows=5, cols=4, boundary_condition=BoundaryCondition.PERIODIC)\n",
    "\n",
    "t = -1.0  # the interaction parameter\n",
    "v = 0.0  # the onsite potential\n",
    "u = 5.0  # the interaction parameter U\n",
    "\n",
    "fhm = FermiHubbardModel.uniform_parameters(\n",
    "    lattice=square_lattice,\n",
    "    uniform_interaction=t,\n",
    "    uniform_onsite_potential=v,\n",
    "    onsite_interaction=u,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To obtain the Hamiltonian in terms of the fermionic operators, we use `second_q_ops` method.\n",
    "The Hamiltonian is returned as an instance of `FermionicOp`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Note\n",
    "    - The number of fermionic operators required is twice the number of lattice sites because of the spin degrees of freedom.\n",
    "    - In the implementation, even indexes correspond to up-spin and odd indexes to down-spin."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fermionic Operator\n",
      "register length=40, number terms=180\n",
      "  (-1+0j) * ( +_0 -_2 )\n",
      "+ (-1+0j) * ( +_0 -_8 )\n",
      "+ (-1+0j) * ( +_0 -_10 )\n",
      "+ (-1+0j) * ( +_0 -_30 )\n",
      "+ (1+0j) * ( -_0 +_2 )\n",
      "+ (1+0j) * ( -_0 +_8 )\n",
      "+ (1+0j) * ( -_0 +_10 )\n",
      "+ (1+0j) * ( -_0 +_30 )\n",
      "+ (- ...\n"
     ]
    }
   ],
   "source": [
    "ham = fhm.second_q_ops(display_format=\"sparse\").reduce()\n",
    "print(ham)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`Lattice` has weights on its edges, so we can define a general interaction matrix using a Lattice instance.\n",
    "Here, we consider the Fermi-Hubbard model on a general lattice on which non-uniform interaction parameters are given.\n",
    "In this case, the weights of the lattice are regarded as the interaction matrix. After generating the Hamiltonian (`second_q_ops`) we can use a qubit converter to generate the qubit operators and/or use any of the available algorithms to solver the corresponding lattice problem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fermionic Operator\n",
      "register length=12, number terms=28\n",
      "  (1+1j) * ( +_0 -_2 )\n",
      "+ (-1+0j) * ( +_0 -_4 )\n",
      "+ (-1+1j) * ( -_0 +_2 )\n",
      "+ (1+0j) * ( -_0 +_4 )\n",
      "+ (1+1j) * ( +_1 -_3 )\n",
      "+ (-1+0j) * ( +_1 -_5 )\n",
      "+ (-1+1j) * ( -_1 +_3 )\n",
      "+ (1+0j) * ( -_1 +_5 )\n",
      "+ (2+0j) * ( +_4 -_6 )\n",
      "+ (-1-2j) * ( +_4 -_8 )\n",
      "+ (-1+0j) * ( +_4 -_10 )\n",
      "+ (-2+0j) * ( -_4 +_6 )\n",
      "+ (1-2j) * ( -_4 +_8 )\n",
      "+ (1+0j) * ( -_4 +_10 )\n",
      "+ (2+0j) * ( +_5 -_7 )\n",
      "+ (-1-2j) * ( +_5 -_9 )\n",
      "+ (-1+0j) * ( +_5 -_11 )\n",
      "+ (-2+0j) * ( -_5 +_7 )\n",
      "+ (1-2j) * ( -_5 +_9 )\n",
      "+ (1+0j) * ( -_5 +_11 )\n",
      "+ (5+0j) * ( +_10 -_10 +_11 -_11 )\n",
      "+ (3+0j) * ( +_9 -_9 )\n",
      "+ (3+0j) * ( +_8 -_8 )\n",
      "+ (5+0j) * ( +_8 -_8 +_9 -_9 )\n",
      "+ (5+0j) * ( +_6 -_6 +_7 -_7 )\n",
      "+ (5+0j) * ( +_4 -_4 +_5 -_5 )\n",
      "+ (5+0j) * ( +_2 -_2 +_3 -_3 )\n",
      "+ (5+0j) * ( +_0 -_0 +_1 -_1 )\n"
     ]
    }
   ],
   "source": [
    "graph = rx.PyGraph(multigraph=False)  # multiigraph shoud be False\n",
    "graph.add_nodes_from(range(6))\n",
    "weighted_edge_list = [\n",
    "    (0, 1, 1.0 + 1.0j),\n",
    "    (0, 2, -1.0),\n",
    "    (2, 3, 2.0),\n",
    "    (4, 2, -1.0 + 2.0j),\n",
    "    (4, 4, 3.0),\n",
    "    (2, 5, -1.0),\n",
    "]\n",
    "graph.add_edges_from(weighted_edge_list)\n",
    "\n",
    "general_lattice = Lattice(graph)  # the lattice whose weights are seen as the interaction matrix.\n",
    "u = 5.0  # the interaction parameter U\n",
    "\n",
    "fhm = FermiHubbardModel(lattice=general_lattice, onsite_interaction=u)\n",
    "\n",
    "ham = fhm.second_q_ops(display_format=\"sparse\").reduce()\n",
    "ham.set_truncation(0)\n",
    "print(ham)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Qiskit Software</th><th>Version</th></tr><tr><td><code>qiskit-terra</code></td><td>0.19.0.dev0+fb934b7</td></tr><tr><td><code>qiskit-aer</code></td><td>0.9.0</td></tr><tr><td><code>qiskit-ignis</code></td><td>0.7.0</td></tr><tr><td><code>qiskit-nature</code></td><td>0.3.0</td></tr><tr><th>System information</th></tr><tr><td>Python version</td><td>3.8.12</td></tr><tr><td>Python compiler</td><td>Clang 13.0.0 (clang-1300.0.29.3)</td></tr><tr><td>Python build</td><td>default, Nov 12 2021 16:34:26</td></tr><tr><td>OS</td><td>Darwin</td></tr><tr><td>CPUs</td><td>4</td></tr><tr><td>Memory (Gb)</td><td>16.0</td></tr><tr><td colspan='2'>Wed Dec 08 19:13:53 2021 JST</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2021.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import qiskit.tools.jupyter\n",
    "\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1"
  },
  "kernelspec": {
   "display_name": "Python 3.8.10 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
